#include "App_Common.h"

long App_Common_GetCurrentTime(void)
{
    struct timeval tv;
    gettimeofday(&tv, NULL);
    return tv.tv_sec * 1000 + tv.tv_usec / 1000;
}

/**
 * @brief 将字符数组转换为十六进制字符串。
 *
 * 该函数接收一个字符数组及其长度，将字符数组中的每个字节转换为对应的两位十六进制字符，
 * 最终返回一个包含转换结果的十六进制字符串。调用者需要负责释放该函数返回的内存，
 * 以避免内存泄漏。
 *
 * @param array 输入的字符数组，包含需要转换为十六进制的原始数据。
 * @param arrLen 字符数组的长度，即需要转换的字节数。
 * @return char* 转换后的十六进制字符串。若转换失败或发生错误，返回 NULL。
 */
char *App_Common_ArrayToHexString(char *array, int arrLen)
{
    // 1.申请hexString内存
    char *hexString = (char *)malloc(arrLen * 2 + 1);
    // 2.遍历array，将每个字节转换为两位十六进制字符
    for (int i = 0; i < arrLen; i++)
    {
        sprintf(hexString + i * 2, "%02X", array[i]);
    }
    // 3.添加结束符
    hexString[arrLen * 2] = '\0';
    return hexString;
}

/**
 * @brief 将十六进制字符串转换为字符数组。
 *
 * 该函数接收一个十六进制字符串，将其转换为对应的字符数组。转换完成后，
 * 通过 `arrLen` 指针返回字符数组的长度。调用者需要负责释放该函数返回的内存，
 * 以避免内存泄漏。
 *
 * @param hexString 输入的十六进制字符串，包含需要转换为字符数组的原始数据。
 * @param arrLen 用于返回转换后字符数组长度的指针。
 * @return char* 转换后的字符数组。若转换失败或发生错误，返回 NULL。
 */
char *App_Common_HexStringToArray(char *hexString, int *arrLen)
{
    // 1.得到hexstr的长度
    int hexstr_len = strlen(hexString);
    // 2.保存字符数组的长度
    *arrLen = hexstr_len / 2;
    // 3.申请字符数组的内存
    char *array = (char *)malloc(*arrLen);
    // 4.遍历16进制字符串（每次取两个字符）将每个字符转换为对应的字节
    for (int i = 0; i < *arrLen; i++)
    {
        sscanf(hexString + i * 2, "%02X", (unsigned int *)&array[i]);
    }
    return array;
}
